import logger from "./logger";

/**
 * 由于zone.js在tsconfig target ES2015 以上版本中结合async/await使用会失效:
 * https://github.com/angular/angular/issues/31730
 * 因此手动实现ES2020中的Promise.allSettled()方法以便项目中使用.
 * 并发执行多个Promise，并且等到所有的Promise状态发生改变才返回
 * @param promiseArray
 */
export const allDone = (promiseArray: Array<Promise<any>>): Promise<Array<any>> => new Promise((resolve, reject) => {
  const { length } = promiseArray;
  if (length < 1) { // 无任务情况下直接返回
    resolve([]);
  }
  let doneNum = 0; // 已完成个数计数器
  const resultArray = new Array(length);
  let err = null; // 执行错误
  /**
   * 所有子任务执行完都执行回调逻辑
   */
  const callBack = () => {
    // 判断是否执行完所有子任务
    if (doneNum === length) {
      if (err) {
        return reject(err);
      }
      resolve(resultArray)
    }
  }
  // 挨个执行子任务
  promiseArray.forEach((promise, index) => {
    promise.then(res => {
      resultArray[index] = res;
      doneNum += 1;
      callBack();
    }).catch(e => {
      logger.error('执行子任务出现了异常:', e);
      err = e;
      doneNum += 1;
      callBack();
    })
  })
})